package net.aaa.hotel.util;

import java.io.Serializable;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.*;

/**
 * @author yuyongli
 * @Date 2020/10/15
 */
public class TransBean {

    /**
     * ����request�����Ĳ���Map����ָ����ʵ��Bean�����Խ��бȽϣ�������������ͬ�Ĳ���ת�����������͵�ֵ��
     * ��������Ӧ��set������Bean�����Ը�ֵ��
     *
     * @param map=request.getParameterMap();
     * @param obj Ҫ���Ķ���
     *
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     */
    public static void populate(Object obj,Map<String,String[]> map){
        Set<String> keySet=map.keySet();
        Class objClass = obj.getClass();
        Field[] fields = objClass.getDeclaredFields();
        try {
            for(Field field:fields){
                String propName=field.getName();
                if(field.getType().isArray()
                        ||field.getType().getName().equals("java.util.List")){
                    if (map.get(propName) != null ||map.get(propName + "[]") != null) {
                        //����������ж��Ԫ��
                        //������������飬�������ƿ���Ϊ"xxx[]"��ajax������json���������,����Ҫ������ġ�[]��ȥ���ٺ����������бȽ�
                        field.setAccessible(true);
                        field.set(obj, convertArray(
                                map.get(propName) == null ?
                                        map.get(propName + "[]") : map.get(propName),
                                field.getType().getComponentType()));
                        //���ַ�������ת���ɸ����Ե��������Ͳ���ֵgetComponentType():���������Ԫ�ص�����
                    }
                }else {
                    if (map.get(propName) != null && map.get(propName).length == 1 && map.get(propName)[0] != null) {//���ֵ����ֻ��һ��Ԫ�ز��Ҳ�Ϊ��
                        field.setAccessible(true);//�������Կɷ���
                        field.set(obj, convert(map.get(propName)[0], field.getType()));//���ַ���ת���ɸ����Ե����Ͳ���ֵ
                    }
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    public static  List populate(Class objClass,List<Map> listMapData){
        if(listMapData==null||listMapData.size()==0)return null;
        List list=new ArrayList();
        Field[] fields = objClass.getDeclaredFields();//��ø�������������������
        try {
            for(Map map:listMapData) {
                Object obj=objClass.newInstance();//����ʵ�������
                for (Field field : fields) {//������������
                    String propName = field.getName();//��õ�ǰ���Ե�����
                    if (map.containsKey(propName)){//���map�а���������
                        field.setAccessible(true);//�������Կɷ���
                        field.set(obj,
                                convert(map.get(propName)==null?
                                                "":map.get(propName).toString(),
                                        field.getType()));
                        //������������ֵ�����ｫ�������͵�ֵ��ת����string��Ȼ����ת���ɸ����Զ�Ӧ�����ͣ�
                    }
                }
                list.add(obj);
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return list;
    }

    /**
     * ��������ַ�������ת�����ƶ�����������,�����ʽ��ƥ���򷵻�null
     * @param <T>
     * @param param Ҫת���Ĳ����ַ���
     * @param clas	 ת����Ŀ��CLASS
     * @return
     */
    private static <T extends Serializable> T convert(String param, Class clas) {
        if (param == null || param == "" || clas == null) return null;
        String type = clas.getName();// ���Ҫת����������������
        if (type.equals("java.lang.String"))
            return (T) param;
        try {// ���ݲ�ͬ���͵����ԣ����ز�ͬ�Ľ������������쳣���򷵻�null
            if (type.equals("java.util.Date")) {
                return (T) new Date(java.sql.Date.valueOf(param)
                        .getTime());
            }
            if (type.equals("java.sql.Date")) {
                return (T) java.sql.Date.valueOf(param);
            }
            if (type.equals("java.sql.Timestamp")) {
                return (T) java.sql.Timestamp.valueOf(param);
            }
            if (type.equals("java.lang.Char")) {
                return (T) Character.valueOf(param.charAt(0));
            }
            if (type.equals("java.lang.Integer") || type.equals("int")) {
                return (T) new Integer(param);
            }
            if (type.equals("java.lang.Double") || type.equals("double")) {
                return (T) new Double(param);
            }
            if (type.equals("java.lang.Float") || type.equals("float")) {
                return (T) new Float(param);
            }
            if (type.equals("java.lang.Byte") || type.equals("boolean")) {
                return (T) new Boolean(param);
            }
            if (type.equals("java.lang.Short") || type.equals("short")) {
                return (T) new Short(param);
            }
            if (type.equals("java.lang.Long") || type.equals("long")) {
                return (T) new Long(param);
            }
            if (type.equals("java.lang.Boolean") || type.equals("boolean")) {
                return (T) new Boolean(param);
            }
        } catch (Exception e) {
        }
        return null;
    }

    /**
     * ��������ַ����������ת����ָ�����������͵�����,�����ʽ��ƥ���򷵻�null
     * @param param Ҫת���Ĳ����ַ���
     * @param elementClass  ת����Ŀ��CLASS��һ����������Ԫ�ص�Class�������������Class
     * @return
     */
    private static Object convertArray(String[] param, Class elementClass) {
        if (param == null || elementClass == null)
            return null;
        String type = elementClass.getName();// ���Ҫת����������������
        Object array = Array.newInstance(elementClass, param.length);// ����ָ�����͵��������
        if (type.equals("java.lang.String")) {
            return param;
        }
        if (type.equals(List.class.getName())) {
            List list = Arrays.asList(param);//���������List���ϣ����ַ�������ת��ΪLIst����
            return list;
        }

        try {// ���ݲ�ͬ���͵����ԣ����ز�ͬ�Ľ������������쳣���򷵻�null
            if (type.equals("java.util.Date") || type.equals("java.sql.Date")
                    || type.equals("java.sql.Timestamp")) {
                for (int i = 0; i < param.length; i++) {
                    Array.set(array,i, convert(param[i],elementClass));
                }
                return array;
            }
            if (type.equals("java.lang.Character")) {

                for (int i = 0; i < param.length; i++) {
                    Array.setChar(array, i, param[i].charAt(i));
                }
                return array;
            }
            if (type.equals("java.lang.Integer") || type.equals("int")) {
                for (int i = 0; i < param.length; i++) {
                    Array.setInt(array, i, Integer.parseInt(param[i]));
                }
                return array;
            }
            if (type.equals("java.lang.Double") || type.equals("double")) {
                for (int i = 0; i < param.length; i++) {
                    Array.setDouble(array, i, Double.parseDouble(param[i]));
                }
                return array;
            }
            if (type.equals("java.lang.Float") || type.equals("float")) {
                for (int i = 0; i < param.length; i++) {
                    Array.setFloat(array, i, Float.parseFloat(param[i]));
                }
                return array;
            }
            if (type.equals("java.lang.Byte") || type.equals("byte")) {
                for (int i = 0; i < param.length; i++) {
                    Array.setByte(array, i, Byte.parseByte(param[i]));
                }
                return array;
            }
            if (type.equals("java.lang.Short") || type.equals("short")) {
                for (int i = 0; i < param.length; i++) {
                    Array.setShort(array, i, Short.parseShort(param[i]));
                }
                return array;
            }
            if (type.equals("java.lang.Long") || type.equals("long")) {
                for (int i = 0; i < param.length; i++) {
                    Array.setLong(array, i, Long.parseLong(param[i]));
                }
                return array;
            }
            if (type.equals("java.lang.Boolean") || type.equals("boolean")) {
                for (int i = 0; i < param.length; i++) {
                    Array.setBoolean(array, i, Boolean.parseBoolean(param[i]));
                }
                return array;
            }

        } catch (Exception e) {
        }
        return null;
    }


}
 